/*****************************************************************************
 * Http与服务器交互
 ****************************************************************************/
var http = null;
var _http_htmlPath = window.document.location.href;
// 根据网页所在的文件夹判断，使用不同的登录地址
if(_http_htmlPath.indexOf("/page/") != -1) {
	// 普通用户界面登录地址
	http = new HttpRequest(null, "/page/login.html");
} else if(_http_htmlPath.indexOf("/admin/") != -1) {
	// 管理员登录地址
	http = new HttpRequest(null, "/admin/index.html");
} else if(_http_htmlPath.indexOf("/weixin/") != -1) {
	// 管理员登录地址
	http = new HttpRequest(null, "/admin/index.html");
} else if(_http_htmlPath.indexOf("/card/") != -1) {
	// 饭卡登录地址
	http = new HttpRequest(null, "/card/index.html");
}

/*****************************************************************************
 * Note:封装ajax的get和post请求
 * @param {serverUrl} 服务器请求地址.
 * @param {noLoginRedirectPage} 用户未登录时网页跳转地址.
 ****************************************************************************/
function HttpRequest(serverUrl, noLoginRedirectPage) {
	var SERVER_URL = null;
	var LOGIN_PAGE = noLoginRedirectPage;

	// TODO 前后端分离启用下面参数
	// serverUrl = "http://nt.wison.com/";
	// console.log(SERVER_URL);

	if(serverUrl == null) {
		var strFullPath = window.document.location.href;
		var strPath = window.document.location.pathname;
		var pos = strFullPath.indexOf(strPath);
		SERVER_URL = strFullPath.substring(0, pos);
	}
	// TODO 如果某些场合需要跨域请求其它服务器地址，则指定构造函数的参数
	else {
		SERVER_URL = serverUrl;
	}

	/************************************************************************
	 * @desc 包装URL请求地址，加上全路径和用户请求信息
	 * @param {url} 请求地址.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	HttpRequest.prototype.getUrl = function(url) {
		url = this.addUserInfor(url);
		// 如果url本身开头就是http，那么不用处理
		if(url.indexOf("http") != 0) {
			// debugger
			// 如果是后台服务器请求，如果是以.do结尾或者中间有.do?
			var str = ".do";
			var len = -str.length;
			if(url.slice(len) == str || url.indexOf(".do?") != -1) {
				// 如果是后台请求，则使用后台请求前缀地址
				url = SERVER_URL + url;
			} else {
				// 如果是前端html文件请求，则使用前端请求前缀地址
				url = ctx + url;
			}
		};
		// console.log(url);
		return url;
	}

	/************************************************************************
	 * @desc 当前页面跳转至指定网页地址
	 * @param {url} 请求地址.
	 * @param {data} 要加的参数.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	this.gotoHtml = function(url, data) {
		var token = localStorage.getItem('_token');
		var params = "";
		if(url.indexOf('?') == -1) {
			params = '?';
		} else {
			params = '&';
		}
		if(token != "") {
			params = params + "_token=" + token + '&';
		}
		// 如果还有json对象的参数
		if(arguments.length > 1) {
			for(var key in data) {
				params = params + key + '=' + data[key] + '&';
			}
		}
		params = params.substr(0, params.length - 1);
		url = url + params;
		url = encodeURI(url);
		url = ctx + url;
		// 加上随机数字
		if(url.indexOf("?") != -1) {
			url = url + "&d=";
		} else {
			url = url + "?d=";
		}
		url = url + (new Date()).getTime();
		window.location.href = url;
	}

	/************************************************************************
	 * @desc 跳转至登录页
	 * @author fgg047 <9110530@qq.com>
	 * @since 2019-09-16
	 ************************************************************************/
	HttpRequest.prototype.gotoLogin = function() {
		window.top.location.href = ctx + LOGIN_PAGE;
	}

	/************************************************************************
	 * @desc 发送异步Get请求
	 * @param {url} 请求地址.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 如果用户未登录跳转至登录页，默认跳转，有值就不跳转.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	HttpRequest.prototype.get = function(url, callback, noRedirect) {
		this.doGet(true, url, callback, noRedirect);
	}

	/************************************************************************
	 * @desc 发送同步Get请求
	 * @param {url} 请求地址.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 如果用户未登录跳转至登录页，默认跳转，有值就不跳转.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	HttpRequest.prototype.getSync = function(url, callback, noRedirect) {
		this.doGet(false, url, callback, noRedirect);
	}

	/************************************************************************
	 * @desc 发送Post请求
	 * @param {url} 请求地址.
	 * @param {params} 请求参数.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 如果用户未登录跳转至登录页，默认跳转，有值就不跳转.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	HttpRequest.prototype.post = function(url, params, callback, noRedirect) {
		this.doPost(true, url, params, callback, noRedirect);
	};

	/************************************************************************
	 * @desc 发送同步Post请求
	 * @param {url} 请求地址.
	 * @param {params} 请求参数.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 如果用户未登录跳转至登录页，默认跳转，有值就不跳转.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	HttpRequest.prototype.postSync = function(url, params, callback, noRedirect) {
		this.doPost(false, url, params, callback, noRedirect);
	}

	/************************************************************************
	 * @desc 发送get请求
	 * @param {async} 是否是异步请求.
	 * @param {url} 请求地址.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 如果用户未登录跳转至登录页，默认跳转，有值就不跳转.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	this.doGet = function(async, url, callback, noRedirect) {
		url = this.getRequestUrl(url);
		var that = this;
		$.ajax({
			type: "GET",
			url: url,
			async: async,
			// dataType: "json", 如果不指定，jQuery将自动根据HTTP包MIME信息来智能判断
			success: function(data, status) {
				that.doCallback(status, data, callback, noRedirect);
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				callback({
					"success": false,
					"message": "服务器请求错误！status:" + XMLHttpRequest.status + ",textStatus:" + textStatus
				});
			}
		});
	}

	/************************************************************************
	 * @desc 发送Post请求
	 * @param {async} 是否是异步请求.
	 * @param {url} 请求地址.
	 * @param {params} 请求参数.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 如果用户未登录跳转至登录页，默认跳转，有值就不跳转.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	this.doPost = function(async, url, params, callback, noRedirect) {
		url = this.getRequestUrl(url);
		// debugger
		var that = this;
		$.ajax({
			type: "POST",
			url: url,
			async: async,
			data: params,
			// dataType: "json", 如果不指定，jQuery将自动根据HTTP包MIME信息来智能判断
			success: function(data, status) {
				that.doCallback(status, data, callback, noRedirect);
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				callback({
					"success": false,
					"message": "服务器请求错误！status:" + XMLHttpRequest.status + ",textStatus:" + textStatus
				});
			}
		});
	}

	/************************************************************************
	 * @desc 给请求地址加上随机数和用户标识参数
	 * @param {url} 请求参数.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	this.getRequestUrl = function(url) {
		// 加上全路径
		if(url.indexOf("http") != 0) {
			url = SERVER_URL + url;
		}
		// 加上随机数字
		if(url.indexOf("?") != -1) {
			url = url + "&d=";
		} else {
			url = url + "?d=";
		}
		// 加上用户Token标识
		url = url + (new Date()).getTime();
		var token = localStorage.getItem('_token');
		if(token != "") {
			url = url + "&_token=" + token;
		}
		// console.log(url);
		return url;
	}

	/************************************************************************
	 * @desc 解析请求返回的数据
	 * @param {status} 返回的状态.
	 * @param {data} 返回的数据.
	 * @param {callback} 回调函数.
	 * @param {noRedirect} 检测出用户未登录是否不要跳转至登录页.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	this.doCallback = function(status, data, callback, noRedirect) {
		// debugger
		if(status == "success") {
			// 如果没有登录
			if(data == "logining first") {
				// 如果不需要重定向
				if(noRedirect) {
					callback({
						"success": false,
						"message": data
					});
					return;
				} else {
					window.top.location.href = ctx + noLoginRedirectPage;
					return;
				}
			} else {
				callback(data);
			}
		} else {
			callback({
				"success": false,
				"message": "服务器请求错误！status:" + status
			});
		}
	}

	/************************************************************************
	 * @desc 添加用户信息并格式化请求参数
	 * @param {params} 请求参数.
	 * @author fgg047 <9110530@qq.com>
	 ************************************************************************/
	this.addUserInfor = function(params) {
		var token = localStorage.getItem('_token');
		if(params) {
			// 如果是字符串，则直接挂在后面
			if(typeof params == "string") {
				var p = "";
				if(token != "") {
					p = "_token=" + token + '&';
				}
				p = p.substr(0, p.length - 1);
				if(params.indexOf("?") != -1) {
					params = params + '&' + p;
				} else {
					params = params + '?' + p;
				}
			}
			// 如果是json，则转换成字符串
			else {
				if(token != "") {
					params._token = token;
				}
			}
		}
		return params;
	}

	/************************************************************************
	 * 从当前的URL请求地址中获取请求参数
	 * @constructor
	 * @param {key} 参数名称
	 * @author fgg047 <9110530@qq.com>
	 * Note:如果参数名称为空，则返回所有的参数
	 ************************************************************************/
	this.getRequestParams = function(key) {
		var url = decodeURI(decodeURI(window.location.href)); //获取url中"?"符后的字串   
		var theRequest = new Object();
		var index = url.indexOf("?");
		if(index != -1) {
			var str = url.substr(index + 1);
			strs = str.split("&");
			for(var i = 0; i < strs.length; i++) {
				theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
			}
		}
		return key ? theRequest[key] : theRequest;
	}

	/************************************************************************
	 * 下载文件
	 * @constructor
	 * @param {url} 请求地址.
	 * @param {data} 请求参数.
	 * @param {callback} 回调函数.
	 * @author fgg047 <9110530@qq.com>
	 * Note:如果参数名称为空，则返回所有的参数
	 ************************************************************************/
	this.download = function(url, data, callback) {
		this.post("/weixin/account/download.do", data, function(page) {
			callback(page);
			if(page.success) {
				var url = http.getUrl("/file/any/getFile.do");
				jQuery('<form action="' + url + '"method=post">' + // action请求路径及推送方法
						'<input type="text" name="url" value="' + page.dataMap.filename + '"/>' + // 文件路径
						'</form>')
					.appendTo('body').submit().remove();
			} else {
				alert(page.message);
			}
		});
	}
}